home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 3 / DISK2032.ZIP / BMDEMO.C < prev    next >
C/C++ Source or Header  |  1990-09-01  |  14KB  |  512 lines

  1. /*--------------------------------------------------------------
  2.  *  File:           BMDEMO.C
  3.  *  Description:    Demo the MPLUS Bar Menu.  Link only with
  4.  *                  MPLUS 1.0 thru 1.2.  Won't work with 1.3.
  5.  *
  6.  *                  This demo is obsolete but included to illustrate
  7.  *                  conversion of the bar menu system.  See 
  8.  *                  MENUDEMO.C.
  9.  *
  10.  *  Copyright (c) 1989  Michael Yam
  11.  *-------------------------------------------------------------*/
  12.  
  13. #include <stdio.h>
  14. #include <graph.h>
  15. #include <math.h>
  16.  
  17. #include "gplus.h"
  18. #include "gscreen.h"
  19. #include "mouser.h"
  20. #include "barmenu.h"
  21.  
  22. #define ESC     0x011B          /* scan & ascii code for ESC key */
  23.  
  24. int dummy(), exitfun();
  25. int memfun();
  26. int mres(), hres(), eres(), vres();
  27. int info(), demo1(), demo2();
  28.  
  29. void sinplot();
  30. void setaxis();
  31.  
  32. char *bmtitle[] =
  33. {
  34.     "File",
  35.     "System",
  36.     "Video Mode",
  37.     "Help",
  38.     "",
  39. };
  40.  
  41. char *bftitle[] = 
  42. {
  43.     "Save", "Load", "DOS", "Exit to system", "",
  44.     "Memory", "",
  45.     "Medium Res 4 Color", "Hi Res Black & White", "EGA", "VGA", "",
  46.     "Info", "Demo 1", "Demo 2", "",
  47.     "",
  48. };
  49.  
  50. int (*funselect[])() =
  51. {
  52.     dummy, dummy, dummy, exitfun, NULL,
  53.     memfun, NULL,
  54.     mres, hres, eres, vres, NULL,
  55.     info, demo1, demo2, NULL,
  56.     NULL,
  57. };
  58.  
  59. extern struct videoconfig _videoconfig;
  60.  
  61. /*--------------------------------------------------------------
  62.  *  Function:       main
  63.  *  Description:    demos the bar menu.
  64.  *  Return value:   0 returned to parent process.
  65.  *--------------------------------------------------------------*/
  66. main()
  67. {
  68.     int ret;
  69.     int (*funptr)();
  70.     char ms_flag;
  71.  
  72.     /*      Try to set video mode to EGA
  73.      */
  74.     if( !setvideomode( _ERESCOLOR ) )
  75.         if( !setvideomode( _HRESBW ) )
  76.         {
  77.             printf("\nUnrecognized video hardware.\n");
  78.             exit(1);
  79.         }
  80.  
  81.     bm_init( 1, 1, bmtitle, bftitle, funselect ); 
  82.     bm_exit( ESC, exitfun );        /* enable ESC to quit menu */
  83.     bm_show( BLACK, CYAN, RED );
  84.  
  85.     ms_flag = ms_reset();
  86.     ms_setevent(1);
  87.     ms_showcursor();
  88.  
  89.     if( ms_flag == 0 )
  90.     {
  91.         gdialog( GDINFORM, GDOKAY );
  92.         gdwrite( "No mouse detected but keyboard is\n" );
  93.         gdwrite( "supported.  Press \"O\" to quit dialogue\n");
  94.         gdwrite( "box, then press ALT+first letter of\n");
  95.         gdwrite( "menu title.  See chapter 6.\n");
  96.         gdprompt();
  97.         gdclose();
  98.     }
  99.  
  100.     funptr = NULL;
  101.  
  102.     while( funptr != exitfun || ret != 0)
  103.     {
  104.         funptr = bm_run( BLUE, WHITE );
  105.         if ( funptr != NULL)
  106.             ret = funptr();             /* execute selected function */
  107.     }
  108.     setvideomode( _DEFAULTMODE );
  109.     ms_setevent(0);
  110.     return 0;
  111. }
  112. /*--------------------------------------------------------------
  113.  *  Function:       dummy
  114.  *  Description:    Dummy function to invoke from bar menu
  115.  *  Return value:   0
  116.  *--------------------------------------------------------------*/
  117. int dummy()
  118. {
  119.     gdialog( GDINFORM, GDOKAY );
  120.     gdwrite("Function not available.");
  121.     gdprompt();
  122.     gdclose();
  123.     return 0;
  124. }
  125. /*--------------------------------------------------------------
  126.  *  Function:       exitfun
  127.  *  Description:    quit this program
  128.  *  Return value:   0
  129.  *--------------------------------------------------------------*/
  130. int exitfun()
  131. {
  132.     int i;
  133.  
  134.     gdialog( GDWARN, GDYESNO );
  135.     gdwrite( "Quit bar menu demo?");
  136.     i = gdprompt();
  137.     gdclose();
  138.  
  139.     return i;
  140. }
  141. /*--------------------------------------------------------------
  142.  *  Function:       memfun
  143.  *  Description:    Display memory info to dialog box
  144.  *  Return value:   0
  145.  *--------------------------------------------------------------*/
  146. int memfun()
  147. {
  148.     char buffer[41];
  149.  
  150.     gdialog( GDINFORM, GDOKAY );
  151.  
  152.     sprintf( buffer, "Memory available: %u bytes\n", _memavl() );
  153.     gdwrite( buffer );
  154.     sprintf( buffer, "Max contiguous block: %u bytes\n", _memmax() );
  155.     gdwrite( buffer );
  156.  
  157.     gdprompt();
  158.     gdclose();
  159.  
  160.     return 0;
  161. }
  162. /*--------------------------------------------------------------
  163.  *  Function:       mres
  164.  *  Description:    Set the screen to medium resolution, 4 color
  165.  *  Return value:   0
  166.  *--------------------------------------------------------------*/
  167. int mres()
  168. {
  169.     char buffer[41];
  170.     int i;
  171.  
  172.     gdialog( GDINFORM, GDOKCAN );
  173.     gdwrite( "Reset mode to four color,\nmedium resolution?" );
  174.     i = gdprompt();
  175.     gdclose();
  176.  
  177.     if( i == 0 )
  178.     {
  179.         if( setvideomode( _MRES4COLOR ) == 0 )
  180.         {
  181.             gdialog( GDERROR, GDOKAY );
  182.             gdwrite( "Video mode not supported by hardware." );
  183.             gdprompt();
  184.             gdclose();
  185.         }
  186.         else
  187.         {
  188.             _selectpalette(1);
  189.             bm_init( 1, 1, bmtitle, bftitle, funselect );
  190.             bm_show( 1, 2, 3 );
  191.             ms_showcursor();
  192.         }
  193.     }
  194.     
  195.     return 0;
  196. }
  197. /*--------------------------------------------------------------
  198.  *  Function:       hres
  199.  *  Description:    Set the screen to black and white hi res
  200.  *  Return value:   0
  201.  *--------------------------------------------------------------*/
  202. int hres()
  203. {
  204.     char buffer[41];
  205.     int i;
  206.  
  207.     gdialog( GDINFORM, GDOKCAN );
  208.     gdwrite( "Reset mode to black and white,\nhigh resolution?" );
  209.     i = gdprompt();
  210.     gdclose();
  211.  
  212.     if( i == 0 )
  213.     {
  214.         if( setvideomode( _HRESBW ) == 0 )
  215.         {
  216.             gdialog( GDERROR, GDOKAY );
  217.             gdwrite( "Video mode not supported by hardware." );
  218.             gdprompt();
  219.             gdclose();
  220.         }
  221.         else
  222.         {
  223.             bm_init( 1, 1, bmtitle, bftitle, funselect );
  224.             bm_show( 0x00, 0x07, 0x07 );
  225.             ms_showcursor();
  226.         }
  227.     }
  228.     
  229.     return 0;
  230. }
  231. /*--------------------------------------------------------------
  232.  *  Function:       eres
  233.  *  Description:    Set the screen to ega, 16 color
  234.  *  Return value:   0
  235.  *--------------------------------------------------------------*/
  236. int eres()
  237. {
  238.     char buffer[41];
  239.     int i;
  240.  
  241.     gdialog( GDINFORM, GDOKCAN );
  242.     gdwrite( "Reset mode to ega color?" );
  243.     i = gdprompt();
  244.     gdclose();
  245.  
  246.     if( i == 0 )
  247.     {
  248.         /*      Microsoft is weird.  If we go from VGA to EGA, we get
  249.          *      43 line EGA.  Avoid this by going thru another graphics mode.
  250.          */
  251.         setvideomode( _MRES4COLOR );
  252.         if( setvideomode( _ERESCOLOR ) == 0 )
  253.         {
  254.             gdialog( GDERROR, GDOKAY );
  255.             gdwrite( "Video mode not supported by hardware." );
  256.             gdprompt();
  257.             gdclose();
  258.         }
  259.         else
  260.         {
  261.             bm_init( 1, 1, bmtitle, bftitle, funselect );
  262.             bm_show( BLACK, CYAN, RED );
  263.             ms_showcursor();
  264.         }
  265.     }
  266.     return 0;
  267. }
  268. /*--------------------------------------------------------------
  269.  *  Function:       vres
  270.  *  Description:    Set the screen to vga res 
  271.  *  Return value:   0
  272.  *--------------------------------------------------------------*/
  273. int vres()
  274. {
  275.     char buffer[41];
  276.     int i;
  277.  
  278.     gdialog( GDINFORM, GDOKCAN );
  279.     gdwrite( "Reset mode to vga color?" );
  280.     i = gdprompt();
  281.     gdclose();
  282.  
  283.     if( i == 0 )
  284.     {
  285.         if( setvideomode( _VRES16COLOR ) == 0 )
  286.         {
  287.             gdialog( GDERROR, GDOKAY );
  288.             gdwrite( "Video mode not supported by hardware." );
  289.             gdprompt();
  290.             gdclose();
  291.         }
  292.         else
  293.         {
  294.             bm_init( 1, 1, bmtitle, bftitle, funselect );
  295.             bm_show( BLACK, CYAN, RED );
  296.             ms_showcursor();
  297.         }
  298.     }
  299.     
  300.     return 0;
  301. }
  302. /*--------------------------------------------------------------
  303.  *  Function:       info
  304.  *  Description:    info function invoked from bar menu
  305.  *  Return value:   0
  306.  *--------------------------------------------------------------*/
  307. int info()
  308. {
  309.     int device;
  310.     int ch;
  311.     struct ms_status ms_status;
  312.     GWDW *gwptr;
  313.  
  314.     if( _videoconfig.numtextcols <= 40 )
  315.     {
  316.         gdialog( GDINFORM, GDOKAY );
  317.         gdwrite( "Please change to\n");
  318.         gdwrite( "hi-res mode to\n");
  319.         gdwrite( "view info." );
  320.         gdprompt();
  321.         gdclose();
  322.         return 0;
  323.     }
  324.  
  325.     gwptr = gwdwtopen( 5, 12, 17, 65, _GBORDER, BRIGHTWHITE, GREEN );
  326.     if( (char *)gwptr == NULL )
  327.     {
  328.         gdialog( GDWARN, GDOKAY );
  329.         gdwrite( "Insufficient memory.\n");
  330.         gdwrite( "Set video mode to B/W Hi-res and\n");
  331.         gdwrite( "try again." );
  332.         gdprompt();
  333.         gdclose();
  334.         return 0;
  335.     }
  336.     outtext("         The MPLUS Graphic Interface Library\n", LIGHTYELLOW, -1);
  337.     outtext("         Copyright 1989, 1990 by Michael Yam\n\n", LIGHTYELLOW, -1 );
  338.     outtext("MPLUS is a user supported program.  If you find this\n", BRIGHTWHITE, -1);
  339.     outtext("package useful, please register your copy by sending\n", BRIGHTWHITE, -1);
  340.     outtext("fifty dollars ($50) to:\n\n", BRIGHTWHITE, -1 );
  341.     outtext("     Michael Yam\n", BRIGHTWHITE, -1 );
  342.     outtext("     230 East 88th St.  #6B\n", BRIGHTWHITE, -1 );
  343.     outtext("     New York, NY  10128\n\n", BRIGHTWHITE, -1 );
  344.     outtext("Thank you for your support!   ", BRIGHTWHITE, -1 );
  345.     outtext("Press a key...", BLACK, -1 );
  346.     while(1)
  347.     {
  348.         device = dev_ready( &ch, &ms_status );
  349.         if( device == _KB )
  350.         {
  351.             if( ch != 0 )
  352.                 break;
  353.         }
  354.         if( device == _MS )
  355.         {
  356.             if( ms_status.rbtn || ms_status.lbtn )
  357.                 break;
  358.         }
  359.     }
  360.     gwdwclose( gwptr );
  361.     return 0;
  362. }
  363. /*--------------------------------------------------------------
  364.  *  Function:       demo1
  365.  *  Description:    plot a sine wave
  366.  *  Return value:   0
  367.  *--------------------------------------------------------------*/
  368. int demo1()
  369. {
  370.     extern struct videoconfig _videoconfig;
  371.  
  372.     short fg, bg, highlite;
  373.     int ch;
  374.     int device;
  375.     double pi;
  376.     struct ms_status ms_status;
  377.     GWDW *gwptr1, *gwptr2;
  378.  
  379.     /*      Although MPLUS is geared for EGA and VGA modes, try to
  380.      *      accomodate low res graphics.
  381.      */
  382.     if( _videoconfig.mode == _MRES4COLOR )
  383.     {
  384.         _selectpalette(1);
  385.         fg = 1;
  386.         bg = 2;
  387.         highlite = 3;
  388.     }
  389.     else if( _videoconfig.mode == _HRESBW )
  390.     {
  391.         fg = 7;
  392.         bg = 0;
  393.         highlite = 7;
  394.     }
  395.     else
  396.     {
  397.         fg = MAGENTA;
  398.         bg = LIGHTYELLOW;
  399.         highlite = BLUE;
  400.     }
  401.  
  402.     pi = 3.141592654;
  403.     gwptr1 = gwdwopen( 20, 20, 300, 150, _GBORDER, fg, bg );
  404.     _setcolor( highlite );
  405.     setaxis( gwptr1 );
  406.     sinplot( -2*pi, 2*pi, 280, 50 );
  407.  
  408.     gwptr2 = gwdwtopen( 22, 1, 24, 40, _GFILLINTERIOR, bg, fg );
  409.     outtext( "Press a key or mouse button...", highlite, -1 );
  410.  
  411.     while (1)
  412.     {
  413.         /*      Wait for keystroke or mouse buttons.
  414.          */
  415.         device = dev_ready( &ch, &ms_status );
  416.         if( device == _MS )
  417.         {
  418.             if( ms_status.lbtn || ms_status.rbtn )
  419.                 break;
  420.         }
  421.         else if( device == _KB )
  422.         {
  423.             if( ch != 0 )
  424.                 break;
  425.         }
  426.     }
  427.     gwdwclose( gwptr2 );
  428.     gwdwclose( gwptr1 );
  429.     return 0;
  430. }
  431. /*--------------------------------------------------------------
  432.  *  Function:       sinplot
  433.  *  Description:    plot a sine wave
  434.  *  Return value:   none
  435.  *--------------------------------------------------------------*/
  436. void sinplot( range1, range2, xpixels, ysf )
  437. double range1;
  438. double range2;
  439. short xpixels;                  /* x pixels available */
  440. int ysf;                        /* y scale factor */
  441. {
  442.     int i;
  443.     int cursor;
  444.     double numperxpix;
  445.     double xpixpernum;
  446.     double x, y;
  447.  
  448.     cursor = ms_cursor();
  449.     ms_hidecursor();
  450.     numperxpix = (fabs(range2-range1))/(double)xpixels;
  451.     xpixpernum = 1/numperxpix;
  452.  
  453.     /*      Calculate first point.  Position cursor with _moveto.
  454.      *      Adjust sign for y axis.
  455.      */
  456.     x = range1;
  457.     y = sin( x );
  458.     _moveto( range1/numperxpix, -( y*ysf ) );
  459.  
  460.     for( i=1; i<xpixels; ++i)
  461.     {
  462.         x += numperxpix;
  463.         y = sin( x );
  464.         _lineto( x * xpixpernum, -(y*ysf) );
  465.     }
  466.     if( cursor )
  467.         ms_showcursor();
  468. }
  469. /*--------------------------------------------------------------
  470.  *  Function:       setaxis
  471.  *  Description:    draw axis and set logical origin to center
  472.  *                  of screen.
  473.  *  Return value:   none
  474.  *--------------------------------------------------------------*/
  475. void setaxis( gwptr )
  476. GWDW *gwptr;
  477. {
  478.     int cursor;
  479.     short xctr, yctr;
  480.  
  481.     cursor = ms_cursor();
  482.     ms_hidecursor();
  483.     xctr = (gwptr->x2-gwptr->x1)/2;
  484.     yctr = (gwptr->y2-gwptr->y1)/2;
  485.  
  486.     _moveto( xctr, 0 );
  487.     _lineto( xctr, gwptr->y2-gwptr->y1 );
  488.     _moveto( 0, yctr );
  489.     _lineto( gwptr->x2-gwptr->x1, yctr );
  490.  
  491.     gwdwsetorg( gwptr, xctr, yctr );
  492.     if( cursor )
  493.         ms_showcursor();
  494. }
  495. /*--------------------------------------------------------------
  496.  *  Function:       demo2
  497.  *  Description:    
  498.  *  Return value:   0
  499.  *--------------------------------------------------------------*/
  500. int demo2()
  501. {
  502.     gdialog( GDINFORM, GDOKAY );
  503.     gdwrite("This is it.");
  504.     gdprompt();
  505.     gdclose();
  506.  
  507.     return 0;
  508. }
  509. /*-------------------------------------------------------------*
  510.  *                      End of BMDEMO.C                        *
  511.  *-------------------------------------------------------------*/
  512.